#include "MaFenetreServeur.h"
#include <iostream>

MaFenetreServeur::MaFenetreServeur(QTabWidget *parent, Serveur *serveur) : MaFenetre(parent)
{
    // On nomme la fenetre.
    setWindowTitle("Serveur");

    // Mise à jour du bouton About.
    monBoutonPushAbout->setText("A propos de " + windowTitle());
    monBoutonPushAbout->setStatusTip("Donne des informations sur l'onglet " + windowTitle());

    // Mise à jour du bouton EXIT.
    monBoutonPushExit->setText("Fermer l'onglet " + windowTitle());
    monBoutonPushExit->setStatusTip("Ferme l'onglet " + windowTitle());
    monBoutonPushExit->setShortcut(QKeySequence("Ctrl+W"));

    // Création du layout principal (corps).
    layoutPrincipal = new QHBoxLayout;
    //const QIcon icon = QIcon("pic/heberger.png");
    port = new QLineEdit;
    port->setText("50885");
    checkPass = new QCheckBox("Avec mot de passe", this);
    pass = new QLineEdit;
    pass->setVisible(false);
    formLayout = new QFormLayout;
    formLayout->setSpacing(5);
    formLayout->addRow("&Port", port);
    formLayout->addRow(checkPass);
    formLayout->addRow("&Mot de passe", pass);
    monBoutonPushGoServ = new MonBoutonPush("Lancer le serveur", this, ":/png/coServer");
    monBoutonPushGoServ->setToolTip("Lancer le serveur");
    monBoutonPushGoServ->setStatusTip("Lance le serveur");
    monBoutonPushDownServ = new MonBoutonPush("Arrêter le serveur", this, ":/png/decoServer");
    monBoutonPushDownServ->setToolTip("Arrêter le serveur");
    monBoutonPushDownServ->setStatusTip("Arrête le serveur");
    monBoutonPushDownServ->setDisabled(true);
    texte = new QTextEdit;
    texte->setReadOnly(true);
    // le layout gauche.
    layoutGauche = new QVBoxLayout;
    layoutGauche->addItem(formLayout);
    layoutGauche->addWidget(monBoutonPushGoServ);
    layoutGauche->addWidget(monBoutonPushDownServ);
    layoutGauche->addWidget(texte);
    layoutPrincipal->addItem(layoutGauche);

    mainWidgetListeClients = new QWidget(this);
    mainLayoutListeClients = new QVBoxLayout(mainWidgetListeClients);
    //mainWidgetListeClients->setFixedHeight(500);
    //mainWidgetListeClients->setMinimumWidth(500);
    mainScrollAreaListeClients = new QScrollArea(mainWidgetListeClients);
    mainWidgetListeClients->setLayout(mainLayoutListeClients);
    mainLayoutListeClients->addWidget(mainScrollAreaListeClients);
    mainScrollAreaListeClients->setWidgetResizable(false);
    //create another widget with a QVBoxLayout
    scrollAreaVLayout = new QVBoxLayout();
    scrollAreaWidgetContents = new QWidget();
    scrollAreaWidgetContents->setLayout(scrollAreaVLayout);
    scrollAreaVLayout->setSizeConstraint(QLayout::SetFixedSize);
    //add scrolling widget to scroller
    mainScrollAreaListeClients->setWidget(scrollAreaWidgetContents);
    //this->setCentralWidget(mainWidgetListeClients);

    layoutPrincipal->addWidget(mainWidgetListeClients);

    leLayout->addLayout(layoutPrincipal);
    leLayout->addItem(layoutBas);

    this->serveur = new Serveur(this);
    connect(this->serveur, SIGNAL(nouveauClient(QString,QString)), this, SLOT(ajouterFicheClient(QString,QString)));
    connect(this->serveur, SIGNAL(enleverClient(QString)), this, SLOT(enleverFicheClient(QString)));
    connect(this->serveur, SIGNAL(logServeur(QString)), this, SLOT(afficheLog(QString)));

    connect(checkPass, SIGNAL(clicked(bool)), pass, SLOT(setVisible(bool)));
    connect(monBoutonPushGoServ, SIGNAL(clicked()), this, SLOT(lancerServeur()));
    connect(monBoutonPushDownServ, SIGNAL(clicked()), this, SLOT(arreterServeur()));
}

void MaFenetreServeur::lancerServeur()
{
    //if(serveur) delete serveur;
    // si le serveur a un pass.
    if(checkPass->isChecked() && !pass->text().isEmpty())
    {
        serveur->lancerServeur(port->text().toInt(), pass->text());
    }
    else // si le serveur n'a pas de pass.
    {
        serveur->lancerServeur(port->text().toInt(), "");
    }
    if(serveur->isConnecte()) // Si le serveur a démarré correctement.
    {
        texte->setText("Le serveur a été démarré sur le port <strong>" + port->text() + "</strong>.<br/>Des clients peuvent maintenant se connecter.");
        monBoutonPushGoServ->setDisabled(true);
        port->setDisabled(true);
        checkPass->setDisabled(true);
        pass->setDisabled(true);
        monBoutonPushDownServ->setDisabled(false);
        if(checkPass->isChecked() && !pass->text().isEmpty())
        {
            texte->append("<br/>Le mot de passe est : <strong>" + pass->text() + "</strong>");
        }
    }
    else // si le serveur n'a pas démarré correctement.
    {
        texte->setText("Le serveur n'a pas pu être <strong>démarré</strong>. Raison :<br />" + serveur->errorConnecte());
        serveur->arreterServeur();
    }
}

void MaFenetreServeur::arreterServeur()
{
    serveur->arreterServeur();
    monBoutonPushGoServ->setDisabled(false);
    port->setDisabled(false);
    checkPass->setDisabled(false);
    pass->setDisabled(false);
    monBoutonPushDownServ->setDisabled(true);
    texte->setText("Le serveur a été <strong>arrêté</strong>.");
}

void MaFenetreServeur::ajouterFicheClient(QString nom, QString ip)
{
    MaFicheClient *maFicheClientTMP = new MaFicheClient(nom, ip);
    connect(maFicheClientTMP, SIGNAL(sig_kicker(QString)), serveur, SLOT(kickerClient(QString)));
    mapFicheClient[nom] = maFicheClientTMP;
    scrollAreaVLayout->addWidget(maFicheClientTMP);
}

void MaFenetreServeur::enleverFicheClient(QString nom)
{
    QWidget* maFicheClientTMP = mapFicheClient[nom];
    mapFicheClient.remove(nom);
    if(maFicheClientTMP) delete maFicheClientTMP;
}

void MaFenetreServeur::afficheLog(QString log)
{
    texte->append("<br/>" + log);
}
